package com.ruoyi.supplier.service.impl;

import java.util.List;

import com.ruoyi.common.constant.BusinessConstants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.uuid.NumberUtils;
import com.ruoyi.supplier.domain.*;
import com.ruoyi.supplier.mapper.TbCheckProductDetailMapper;
import com.ruoyi.supplier.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;

import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.supplier.mapper.TbStoreInMapper;

/**
 * 入库Service业务层处理
 *
 * @author ruoyi
 * @date 2021-03-06
 */
@Service
public class TbStoreInServiceImpl implements ITbStoreInService {
    @Autowired
    private TbStoreInMapper tbStoreInMapper;
    @Autowired
    private ITbPriceService tbPriceServiceImpl;
    @Autowired
    private ITbPriceStoreService tbPriceStoreServiceImpl;
    @Autowired
    private TbCheckProductDetailMapper tbCheckProductDetailMapper;
    @Autowired
    private ITbProductPackService tbProductPackServiceImpl;

    /**
     * 查询入库
     *
     * @param id 入库ID
     * @return 入库
     */
    @Override
    public TbStoreIn selectTbStoreInById(Long id) {
        return tbStoreInMapper.selectTbStoreInById(id);
    }

    /**
     * 查询入库列表
     *
     * @param tbStoreIn 入库
     * @return 入库
     */
    @Override
    public List<TbStoreIn> selectTbStoreInList(TbStoreIn tbStoreIn) {
        return tbStoreInMapper.selectTbStoreInList(tbStoreIn);
    }

    /**
     * 新增入库
     *
     * @param tbStoreIn 入库
     * @return 结果
     */
    @Transactional
    @Override
    public int insertTbStoreIn(TbStoreIn tbStoreIn) {
        tbStoreIn.setCreateTime(DateUtils.getNowDate());
        tbStoreIn.setCreateBy(SecurityUtils.getUsername());
        int rows = tbStoreInMapper.insertTbStoreIn(tbStoreIn);
        insertTbStoreInDetail(tbStoreIn);
        return rows;
    }

    /**
     * 修改入库
     *
     * @param tbStoreIn 入库
     * @return 结果
     */
    @Transactional
    @Override
    public int updateTbStoreIn(TbStoreIn tbStoreIn) {
        tbStoreIn.setUpdateTime(DateUtils.getNowDate());
        tbStoreIn.setUpdateBy(SecurityUtils.getUsername());
        tbStoreInMapper.deleteTbStoreInDetailByStoreInId(tbStoreIn.getId());
        insertTbStoreInDetail(tbStoreIn);
        return tbStoreInMapper.updateTbStoreIn(tbStoreIn);
    }

    /**
     * 批量删除入库
     *
     * @param ids 需要删除的入库ID
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteTbStoreInByIds(Long[] ids) {
        for (Long lon : ids) {
            TbStoreIn tbStoreIn = tbStoreInMapper.selectTbStoreInById(lon);
            if (tbStoreIn.getStoreStatus() > 0) {

                return -1;
            }
        }
        tbStoreInMapper.deleteTbStoreInDetailByStoreInIds(ids);
        return tbStoreInMapper.deleteTbStoreInByIds(ids);
    }

    /**
     * 删除入库信息
     *
     * @param id 入库ID
     * @return 结果
     */
    @Override
    public int deleteTbStoreInById(Long id) {
        tbStoreInMapper.deleteTbStoreInDetailByStoreInId(id);
        return tbStoreInMapper.deleteTbStoreInById(id);
    }


    /**
     * 新增入库明细信息
     *
     * @param tbStoreIn 入库对象
     */
    public void insertTbStoreInDetail(TbStoreIn tbStoreIn) {
        List<TbStoreInDetail> tbStoreInDetailList = tbStoreIn.getTbStoreInDetailList();
        Long id = tbStoreIn.getId();
        if (StringUtils.isNotNull(tbStoreInDetailList)) {
            List<TbStoreInDetail> list = new ArrayList<TbStoreInDetail>();
            for (TbStoreInDetail tbStoreInDetail : tbStoreInDetailList) {
                tbStoreInDetail.setStoreInId(id);
                System.out.println("tbStoreInDetail.getIsPack():"+tbStoreInDetail.getIsPack());
                list.add(tbStoreInDetail);
            }
            if (list.size() > 0) {
                tbStoreInMapper.batchTbStoreInDetail(list);
            }
        }
    }

    @Override
    @Transactional
    public int insertTbStoreInQty(TbStoreIn tbStoreIn) {
        tbStoreIn.setCreateTime(DateUtils.getNowDate());
        tbStoreIn.setCreateBy(SecurityUtils.getUsername());
        int rows = tbStoreInMapper.insertTbStoreIn(tbStoreIn);
        insertTbStoreInDetailQty(tbStoreIn);
        return rows;
    }

    @Transactional
    @Override
    public int updateTbStoreInQty(TbStoreIn tbStoreIn) {
        tbStoreIn.setUpdateTime(DateUtils.getNowDate());
        tbStoreIn.setUpdateBy(SecurityUtils.getUsername());
        tbStoreInMapper.deleteTbStoreInDetailByStoreInId(tbStoreIn.getId());
        insertTbStoreInDetailQty(tbStoreIn);
        return tbStoreInMapper.updateTbStoreIn(tbStoreIn);
    }

    @Override
    public String selectNumber() {
        String number = tbStoreInMapper.selectNumber();
        return NumberUtils.autoGenericNumber(number, BusinessConstants.RK);
    }

    /**
     * @param tbStoreIn
     */
    public void insertTbStoreInDetailQty(TbStoreIn tbStoreIn) {
        List<TbStoreInDetail> tbStoreInDetailList = tbStoreIn.getTbStoreInDetailList();
        Long id = tbStoreIn.getId();
        if (StringUtils.isNotNull(tbStoreInDetailList)) {
            List<TbStoreInDetail> list = new ArrayList<TbStoreInDetail>();
            for (TbStoreInDetail tbStoreInDetail : tbStoreInDetailList) {
                tbStoreInDetail.setStoreInId(id);
                list.add(tbStoreInDetail);

                /**
                 * 库存明细
                 */
                TbPriceStore tbPriceStore = new TbPriceStore();
                tbPriceStore.setPriceId(tbStoreInDetail.getPriceId());
                tbPriceStore.setStoreId(tbStoreIn.getStoreId());
                tbPriceStore.setsId(tbStoreIn.getsId());
                List<TbPriceStore> tbPriceStoreList = tbPriceStoreServiceImpl.selectTbPriceStoreList(tbPriceStore);
                // 判断是否包装类型,如果是包装类型,按包装数量入库,否则按正常入库
                // 但是如果正常入库，需要计算包装数量的增加
                if(tbStoreInDetail.getIsPack()!=null && tbStoreInDetail.getIsPack().equalsIgnoreCase("Y")){
                    tbPriceStore.setPackCount(tbStoreInDetail.getQty());
                }else{
                    tbPriceStore.setStoreCount(tbStoreInDetail.getQty());
                    Long productId = tbStoreInDetail.getProductId();
                    List<TbProductPack> tbProductPacks = tbProductPackServiceImpl.selectTbProductPackByProductId(productId);
                    if(tbProductPacks!=null && tbProductPacks.size()>0){
                        // 每个商品的包装信息对应的商品有且只有一个
                        TbProductPack tbProductPack = tbProductPacks.get(0);
                        // 获取包装系数 , 包装系数必须为整数
                        Integer packModulus = tbProductPack.getPackModulus();
                        tbPriceStore.setPackCount(tbStoreInDetail.getQty() * packModulus);
                    }


                }
                if (tbPriceStoreList != null && tbPriceStoreList.size() > 0) {
                    tbPriceStore.setId(tbPriceStoreList.get(0).getId());
                    tbPriceStoreServiceImpl.updateTbPriceStoreAddQty(tbPriceStore);
                } else {
                    tbPriceStoreServiceImpl.insertTbPriceStore(tbPriceStore);
                }

                if (tbStoreInDetail.getCheckId() != null && tbStoreInDetail.getCheckId() > 0) {
                    /** 验货明细*/
                    TbCheckProductDetail tbCheckProductDetail = new TbCheckProductDetail();
                    tbCheckProductDetail.setCheckId(tbStoreInDetail.getCheckId());
                    tbCheckProductDetail.setCheckStatus(2); // 已入库
                    tbCheckProductDetailMapper.updateTbCheckProductDetail(tbCheckProductDetail);
                }


            }
            if (list.size() > 0) {
                tbStoreInMapper.batchTbStoreInDetail(list);
            }
        }
    }


}
